package com.aididi.spring.utils;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;

/**
 * @Auther: zx.xu
 * @Description:   多线程事务解决方案
 */
public class TransactionSynchronizedUtil {

    /**
     * 第一种方式
     *
     * 在事务提交之后在操作
     */
/*
    @Transactional(rollbackFor = Exception.class)
    public void saveOrderPackageInfo(PackageInfo packageInfo) {
        //保存包装信息
        packageInfoMapper.save(packageInfo);
        //修改订单状态
        orderMapper.update(packageInfo);
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                // 事务提交后需要执行的业务逻辑
                //异步把包装信息发送至第三方
                threadPoolTaskExecutor.submit(() -> {
                    //查询id为1的数据
                    List<OrderPackageInfo> orderPackageInfo = packageInfoMapper.select(packageInfo.getOrderNo);
                    // todo把数据发送发给第三方

                });
            }
        });
    }*/

    /**
     * 第二种方式
     *
     * 使用事务监听器，在MyTransactionListener类中监听
     */

    /*public void saveOrderPackageInfo(PackageInfo packageInfo) {
        //保存包装信息
        packageInfoMapper.save(packageInfo);
        //修改订单状态
        orderMapper.update(packageInfo);
        // 发布 Spring Event 事件
        ApplicationContextUtil.publishEvent(new MyAfterTransactionEvent(packageInfo));
    }*/


}
